/*
 * Copyright 2009 Max Ishchenko
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package net.ishchenko.idea.nginx.psi.impl;

import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.psi.PsiReference;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet;
import com.intellij.util.NullableFunction;
import net.ishchenko.idea.nginx.annotator.NginxElementVisitor;
import net.ishchenko.idea.nginx.psi.NginxDirective;
import net.ishchenko.idea.nginx.psi.NginxDirectiveValue;
import net.ishchenko.idea.nginx.psi.NginxFileReference;
import org.jetbrains.annotations.NotNull;

import java.util.Collection;

/**
 * Created by IntelliJ IDEA.
 * User: Max
 * Date: 09.07.2009
 * Time: 21:02:29
 */
public class NginxDirectiveValueImpl extends NginxElementImpl implements NginxDirectiveValue {

    public NginxDirectiveValueImpl(ASTNode node) {
        super(node);
    }

    public NginxDirective getDirective() {
        return (NginxDirective) getNode().getTreeParent().getPsi();
    }

    public boolean isFirstValue() {
        return !(getNode().getTreePrev().getTreePrev().getPsi() instanceof NginxDirectiveValue);
    }

    @NotNull
    @Override
    public PsiReference[] getReferences() {

        if (getDirective().getNameString().equals("include")) {

            int offset = getNode().getPsi().getStartOffsetInParent() + 1;
            FileReferenceSet referenceSet = new FileReferenceSet(getText(), this, offset, null, SystemInfo.isFileSystemCaseSensitive) {
                @Override
                protected boolean isSoft() {
                    return true;
                }

                @Override
                public NginxFileReference createFileReference(TextRange textRange, int i, String s) {
                    return new NginxFileReference(this, textRange, i, s);
                }
            };
            referenceSet.addCustomization(FileReferenceSet.DEFAULT_PATH_EVALUATOR_OPTION, new NullableFunction<PsiFile, Collection<PsiFileSystemItem>>() {
                public Collection<PsiFileSystemItem> fun(PsiFile psiFile) {
                    //todo
                    return null;
                }
            });

            return referenceSet.getAllReferences();
        }

        return PsiReference.EMPTY_ARRAY;

    }

    @Override
    public void accept(@NotNull PsiElementVisitor visitor) {
        if (visitor instanceof NginxElementVisitor) {
            ((NginxElementVisitor) visitor).visitDirectiveValue(this);
        } else {
            visitor.visitElement(this);
        }
    }

}